[libspirv] Replace libclc-remangler with SYCLRemangleLibspirvPass#21588
[libspirv] Replace libclc-remangler with SYCLRemangleLibspirvPass#21588wenju-he wants to merge 16 commits intointel:syclfrom
Conversation
Remove libclc-remangler tool and replace it with SYCLBuiltinRemanglePass that remangles SPIR-V built-ins in SYCL user device code to match OpenCL C mangling in libspirv. The pass is inverse of what libclc-remangler did. Motivation: - libclc-remangler executable doesn't fit in runtime build. - libclc-remangler can't justify as a standalone tool in llvm/tools. Changes: - Add SYCLBuiltinRemanglePass. It uses Itanium demangler and adapts SPIR type system and SPIR mangler from SPIRV-LLVM-Translator. - Type transformations: - long long -> long (OpenCL has no long long) - long -> int (Windows or 32-bit only) - signed char -> char - char -> unsigned char (only if char is signed on the host) - _Float16 -> half (with a few w/a for native-cpu libdevice) - Address space adjustments if target's default addrspace is private. - libspirv is now linked into user code after the optimization pipeline by -mlink-builtin-bitcode-postopt flag since the linking must be after remangling. In the future, the linking will be moved to LTO. - Changes in _CLC_DEFINE_MIPMAP_BINDLESS_READS_BUILTIN also exposed a bug in libclc-remangler which would remangle _Z30__spirv_ImageSampleExplicitLodImDv4_cDv3_fET0_T_T1_iS4_S4_ (correct) to _Z30__spirv_ImageSampleExplicitLodImDv4_aDv3_fET0_T_T1_iS1_S1_ This bug was hidden since correct symbol was hardcoded in the source. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
| When the SYCL compiler is in device mode and targeting the NVPTX backend, the | ||
| compiler exposes NVPTX builtins supported by clang. | ||
| incompatible libclc built-ins. When building a SYCL application targeting the | ||
| CUDA backend, the SYCLBuiltinRemangle pass remangles SPIR-V builtins in device |
There was a problem hiding this comment.
I'm wondering could we make clang emit calls to these functions using the correct name mangling from the start instead of re-mangling as a pass?
I was thinking a function attribute that allows to switch the name mangling to be OpenCL compatible could theoretically work for this. We would need something similar if we wanted to author libclc sources in C++.
There was a problem hiding this comment.
I'm wondering could we make clang emit calls to these functions using the correct name mangling from the start instead of re-mangling as a pass?
This is interesting idea, but I don't know about how to implement the automatic mapping.
We would need something similar if we wanted to author libclc sources in C++.
Implement libspirv in C++ and compile in sycl device mode like libdevice does can indeed avoid the remangling issue. However, one problem is that it will be very difficult to share implementation between libclc OpenCL and libspirv builtin wrappers, since eventually the sharing requires a stable interface which SPV-IR intends to be.
elizabethandrews
left a comment
There was a problem hiding this comment.
FE changes just add a pass. FE changes LGTM. I have not reviewed the functionality of the pass.
…RemangleLibspirvPass Not inlined __clc_ functions are not remangled because we only have a single clc library that has OpenCL C mangling.
YuriPlyakhin
left a comment
There was a problem hiding this comment.
4 comments left to address for files owned by me.
YuriPlyakhin
left a comment
There was a problem hiding this comment.
one comment needs to be addressed. #21588 (comment)
Co-authored-by: Yury Plyakhin <yury.plyakhin@intel.com>
YuriPlyakhin
left a comment
There was a problem hiding this comment.
dpcpp-tools owned files LGTM
|
@intel/dpcpp-clang-driver-reviewers @intel/dpcpp-nativecpu-reviewers please review, thanks |
Remove libclc-remangler tool and replace it with SYCLRemangleLibspirvPass
that remangles OpenCL C mangling in libspirv to match with SYCL mangling.
The pass ports the functionalities in the tool into compile pipeline.
Motivation:
Functional changes:
libspirv variants are created without separate remangling step.
llvm-diff changes to remangled libspirv:
a single clc library that defaults to OpenCL C mangling.
Previously, these were called only once and inlined before remangling.
Now, because remangling can generate two caller variants, the _clc
function is called twice, causing the inliner to skip them.
This bug was hidden since correct symbol was hardcoded in the source.
_Z23__spirv_ImageArrayWriteIyiiEvT_T0_T1_i -> Z23__spirv_ImageArrayWriteIyiiEvT_T0_iT1;
_Z23__spirv_ImageArrayWriteImiiEvT_T0_T1_i -> Z23__spirv_ImageArrayWriteImiiEvT_T0_iT1.